import { error, fail, redirect } from '@sveltejs/kit'; import { db } from '$lib/server/db'; import { groceries, categories } from '$lib/server/db/schema'; import { eq } from 'drizzle-orm'; import { loadForGrocery, add as addRef, deleteReference, } from '$lib/server/services/references'; import { deleteGrocery } from '$lib/server/services/groceries'; import { numericId, parseFormString, parseOptionalNumber, } from '$lib/server/services/validation'; import type { Grocery, Reference } from '$lib/server/services/types'; import type { Actions, PageServerLoad } from './$types'; export interface GroceryDetailOutput { item: Grocery & { categoryName: string | null }; references: Reference[]; } export const load: PageServerLoad = async ({ params }) => { const id = numericId(params.id); const [item] = await db.select().from(groceries).where(eq(groceries.id, id)); if (!item) throw error(404, 'Article introuvable'); const [cat] = item.categoryId ? await db .select() .from(categories) .where(eq(categories.id, item.categoryId)) : [null]; const refs = await loadForGrocery(id); return { item: { ...item, categoryName: cat?.name ?? null, }, references: refs, }; }; export const actions: Actions = { add: async ({ request, params }) => { const data = await request.formData(); const groceryId = numericId(params.id); const reference = parseFormString(data.get('reference')); const price = parseOptionalNumber(data.get('price')); const unit = parseFormString(data.get('unit')); const qualityScore = parseOptionalNumber(data.get('quality_score')); if (!reference) { return fail(400, { error: 'La référence est requise' }); } await addRef(groceryId, reference, price, unit, qualityScore); return { success: true }; }, delete: async ({ request }) => { const data = await request.formData(); try { const id = numericId(data.get('id')); await deleteReference(id); } catch { return fail(400, { error: 'ID invalide' }); } return { success: true }; }, deleteItem: async ({ params }) => { const groceryId = numericId(params.id); await deleteGrocery(groceryId); throw redirect(303, '/'); }, };